package com.situ.mall.controller;

import java.util.List;

import com.situ.mall.common.util.JsonUtil;
import com.situ.mall.common.util.RedisUtil;
import com.situ.mall.pojo.entity.Product;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.type.IntegerTypeHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.situ.mall.service.IProductService;

@Controller
@RequestMapping("/product")
public class ProductController {
	@Autowired
	RedisUtil redisUtil;

	@Autowired
	private IProductService productService;

	@RequestMapping("/getProductListPage")
	public String getProductListPage(Integer categoryId, Model model) {
		List<Product> list = productService.selectByCategoryId(categoryId);
		model.addAttribute("list", list);
		return "product_list";
	}

	/**
	 * 查询的key在redis中不存在，对应的id在数据库中也不存在，
	 * 此时被非法用户进行攻击，大量的请求会直接打在db上，造成宕机，
	 * 从而影响整个系统，这种现象称为缓存穿透。
	 * 解决方案：把空的数据也缓存起来，比如空字符串、空对象、空数组或List
	 */
	@RequestMapping("/getProductDetailPage")
	public String getProductDetailPage(Integer id, Model model) {

		// 从缓存中查, 使用hash结构存储,key是字符串，只是hash。
		String productJson = redisUtil.get("product" + id);
		Product product = null;
		if (StringUtils.isBlank(productJson)) {
			// 缓存中没有，从数据库中查找
			product = productService.getProductDetailPage(id);
			if (product != null) {
				// 数据库有此对象，更新到redis缓存
				redisUtil.set("product" + id, JsonUtil.objectToJson(product));
			} else {// 缓存中没有，数据库中也没有
				redisUtil.set("product" + id, JsonUtil.objectToJson(new Product()), 1 * 60);
			}
		} else {
			product = JsonUtil.jsonToPojo(productJson, Product.class);
		}
		model.addAttribute("product", product);
		return "product_detail";
	}
}
